www.gusucode.com > VC++迷宫游戏源代码源码程序 > VC++迷宫游戏源代码源码程序\code\WinGame 2.7\Rabbit.cpp

    // Download by http://www.NewXing.com
#include "stdafx.h"
#include "Rabbit.h"
#include "./include/Key.h"
#include "CreateMap.h"
#include "AnimDate.h"
extern unsigned int g_I;						//全局计数器
int	UpIdx[]={1,2,1,2,4,3,4};//7个
void	CRabbit::New(CBmp24*p,int w,int h,CMazeView*pView)
{
	m_v=5;
	m_Direct=0;
	m_Wait=4;
	m_pMazeView=pView;
	CAnimCtrl::New(p,0,0);
	m_x		=	(w-2)*64+32;	
	m_y		=	(h-2)*64+40;
}
int	CRabbit::Play(void*)
{
	if(IsMultiKey())m_v=4;//斜着走,速度分量减小,保证合速度差不多
	else{m_v=5;}//单一方向走

	if(Key_Up)MoveUp();
	if(Key_Down)MoveDown();
	if(Key_Left) MoveLeft();
	if(Key_Right)MoveRight();

		if(m_Wait>10)
		{
			switch(m_Direct)
			{
			case 0://向下
				m_pBmp=&DownWaitBmp;
				SetFlip(0);
				break;
			case 1://向上
				m_pBmp=&UpWaitBmp;
				SetFlip(0);
				break;
			case 2://向右
				m_pBmp=&LeftWaitBmp;
				SetFlip(1);
				break;
			case 3://向左
				m_pBmp=&LeftWaitBmp;
				SetFlip(0);
				break;
			}
			if(g_I%10==0)	SetIdx((g_I/10));
		}
		m_Wait++;
		if(bSucceed()) return 1;

				return 0;
}
int  CRabbit::bHitLeft()				//是否撞到左边
{	if(m_x-m_v<0) return 1;
	int i = ( m_x - m_v )/64;
	int j = m_y/64;
	if( g_MazeMap[i][j]  <= 0 )
		return 1;
	j = ( m_y + RABBIT_CY )/64;
	if( g_MazeMap[i][j] <= 0 )
		return 1;
	return 0;
}
int  CRabbit::bHitRight()				//是否撞到右边
{
	int i = ( m_x + m_v +  RABBIT_CX)/64;
	int j = m_y/64;
	if( g_MazeMap[i][j] <= 0 )
		return 1;
	j = ( m_y +  RABBIT_CY )/64;
	if( g_MazeMap[i][j] <= 0 )
		return 1;
	return 0;
}
int  CRabbit::bHitTop()				//是否撞到上边
{
	if(m_y-m_v<0 ) return 1;
	int i = m_x /64;
	int j = ( m_y - m_v ) /64;
	if( g_MazeMap[i][j] <= 0 )
		return 1;
	i = ( m_x +  RABBIT_CX ) /64;
	if( g_MazeMap[i][j] <= 0 )
		return 1;
	return 0;
}
int  CRabbit::bHitBottom()			//是否撞到下边
{
	int i = m_x /64;
	int j = ( m_y + m_v +  RABBIT_CY ) /64;
	if( g_MazeMap[i][j] <= 0 )
		return 1;
	i = ( m_x +  RABBIT_CX ) /64;
	if( g_MazeMap[i][j] <= 0 )
		return 1;
	return 0;
}
int  CRabbit::bSucceed()					//是否已经胜利
{
		if( m_x < 10	||	m_y < 10 )
		return 1;
		return 0;	
}
void  CRabbit::MoveLeft()
{
	m_pBmp=&LeftRabbitBmp;
	if(!bHitLeft())	
	{
		AddXY(-m_v,0);
		if( (m_pMazeView->GetX() + PM_CX/2 > m_x) && (m_pMazeView->GetX()-m_v > 0) )
		{
			m_pMazeView->AddXY(-m_v,0);
		}	
	}
	SetIdx(g_I);
	SetFlip(0);
	m_Wait=0;
	m_Direct=3;
}
void  CRabbit::MoveRight()
{
	m_pBmp=&LeftRabbitBmp;
	if(!bHitRight())
	{
		AddXY(m_v,0);
	if( ( m_pMazeView->GetX() + PM_CX/2 < m_x) && (m_pMazeView->GetX()+m_v <= m_pMazeView->m_MaxX) )
		{
			m_pMazeView->AddXY(m_v,0);
		}
	}
	SetIdx(g_I);
	SetFlip(1);
	m_Wait=0;
	m_Direct=2;
}
void  CRabbit::MoveUp()
{
	m_pBmp=&UpRabbitBmp;
	if(!bHitTop())
	{
		AddXY(0,-m_v);
	if(( m_pMazeView->GetY() + PM_CY/2 > m_y ) && (m_pMazeView->GetY() - m_v >0 ) )
		{
				m_pMazeView->AddXY(0,-m_v);

		}
	}
	SetIdx(g_I);
	SetFlip(0);
	m_Wait=0;
	m_Direct=1;
}
void  CRabbit::MoveDown()
{
	m_pBmp=&DownRabbitBmp;
	if(!bHitBottom())
	{
		AddXY(0,m_v);
		if(( m_pMazeView->GetY() + PM_CY/2 <m_y ) && (m_pMazeView->GetY()+ m_v <= m_pMazeView->m_MaxY ) )
		{
				m_pMazeView->AddXY(0,m_v);
		}

	}
	SetIdx(g_I);
	SetFlip(0);
	m_Wait=0;
	m_Direct=0;
}
void	CRabbit::Draw(CBmp24*p)
{
	int x =m_x - m_pMazeView->GetX() +PM_X-RABBIT_VX;
	int y = m_y - m_pMazeView->GetY() +PM_Y-RABBIT_VY;
	m_pBmp->DrawBmp(p,x,y,m_Idx,m_EffectFlag);
}
CRabbit::CRabbit(){}
CRabbit::~CRabbit(){}